/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mindbox.mueblesalpes.presentacion.compras;

import com.mindbox.mueblesalpes.negocio.compras.ComprasMock;
import com.mindbox.mueblesalpes.negocio.compras.ICompras;
import com.mindbox.mueblesalpes.negocio.entity.Compra;
import com.mindbox.mueblesalpes.negocio.entity.Entidad;
import com.mindbox.mueblesalpes.negocio.entity.FormaPago;
import com.mindbox.mueblesalpes.negocio.entity.Venta;
import com.mindbox.mueblesalpes.presentacion.sesion.SessionInfo;
import com.mindbox.mueblesalpes.presentacion.utils.Mensajes;
import com.mindbox.mueblesalpes.presentacion.utils.ReglasNavegacion;
import java.util.ArrayList;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpSession;

/**
 * Backing Bean para la pagina de comprar.xhtml
 * @author jsanchez
 */
public class PagarBackingBean {

    private Venta venta;
    private String descripcionVenta;

    private String idFormaPago;
    private List<SelectItem> formasPago;

    private String idEntidadBancaria;
    private List<SelectItem> entidadesBancaria;

    private String idEntidadTarjeta;
    private List<SelectItem> entidadesTarjeta;

    private boolean validaSesion;
    private boolean combo1;
    private boolean combo2;
    private boolean comprado;
    
    private ICompras compras;

    private String[] lEntidades = {"Visa","Masterd Card","Dinners"};

    /** Creates a new instance of PagarBackingBean */
    public PagarBackingBean() {
        SessionInfo sesion = verificarSesion();
        this.compras = new ComprasMock();
        if (sesion != null) {
            this.venta = sesion.getVenta();
            this.descripcionVenta = this.compras.getDescripcionVenta(venta);

            //Combo para las formas de pago.
            this.formasPago = new ArrayList<SelectItem>();
            this.formasPago.add(new SelectItem("", ""));
            for(FormaPago forma : FormaPago.values()){
                this.formasPago.add(new SelectItem(forma.name(), forma.toString()));
            }

            //Combo para las entidades bancarias.
            this.entidadesBancaria = new ArrayList<SelectItem>();
            this.entidadesBancaria.add(new SelectItem("", ""));
            for(Entidad entidad : this.compras.getEntidadesBancarias()){
                this.entidadesBancaria.add(new SelectItem(entidad.getId(), entidad.getNombre()));
            }

            //Combo para las entidades bancarias.
            this.entidadesTarjeta = new ArrayList<SelectItem>();
            this.entidadesTarjeta.add(new SelectItem("", ""));
            for(Entidad entidad : this.compras.getEntidadesTarjetaCredito()){
                this.entidadesTarjeta.add(new SelectItem(entidad.getId(), entidad.getNombre()));
            }
        }
    }

    private SessionInfo verificarSesion() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession httpSession = (HttpSession) context.getExternalContext().getSession(false);
        SessionInfo sesion = (SessionInfo) httpSession.getAttribute(SessionInfo.class.getName());
        this.validaSesion = true;
        if (sesion == null) {
            //ERRROR
            //TODO Traer msg del properties
            Mensajes.asignarMensajeError("No tiene sesión asignada");
            this.validaSesion = false;
        } else {
            //Validar usuario y cliente
            if (sesion.getUsuario() == null) {
                //TODO Traer msg del properties
                Mensajes.asignarMensajeError("No se ha autenticado el usuario");
                this.validaSesion = false;
            }
            if (sesion.getCliente() == null) {
                //TODO Traer msg del properties
                Mensajes.asignarMensajeError("No se ha registrado como cliente");
                this.validaSesion = false;
            }
            if (sesion.getVenta() == null) {
                //TODO Traer msg del properties
                Mensajes.asignarMensajeError("No se ha realizado ninguna venta");
                this.validaSesion = false;
            }
        }
        return sesion;
    }

    /**
     * Metodo que se ejecuta al realizar un cambio de la forma de pago.
     * @return
     */
    public String cambioFormaPago(){
        this.combo1 = false;
        this.combo2 = false;
        if(this.idFormaPago != null && this.idFormaPago.trim().length() > 0){
            if(this.idFormaPago.equals(FormaPago.ENTIDAD_BANCARIA.name())){
                this.combo1 = true;
            }
            else if(this.idFormaPago.equals(FormaPago.TARJETA_CREDITO.name())){
                this.combo2 = true;
            }
        }
        return null;
    }

    /**
     * Metodo que se ejecuta al realizar un clic sobre cancelar
     * @return
     */
    public String cancelar(){
        return this.cerrar();
    }

    /**
     * Metodo que se ejecuta al realizar un clic sobre terminar compra
     * @return
     */
    public String terminarCompra(){
        SessionInfo sesion = verificarSesion();
        if (sesion != null) {
            if(validarCamposRequeridos()){
                this.setComprado(true);
                this.compras.realizarPago(sesion.getVenta());
            }
            else
                this.setComprado(false);
        }
        return "";
    }

    /**
     * Metodo que se ejecuta al terminar la compra.
     * @return
     */
    public String cerrar(){
        SessionInfo sesion = verificarSesion();
        if (sesion != null) {
            this.compras.cancelarPago(sesion.getVenta());
            sesion.setCarritoCompras(new ArrayList<Compra>());
            sesion.setVenta(null);
            sesion.setMuebleSeleccionado(null);
        }
       return ReglasNavegacion.inicio.name();
    }

    private boolean validarCamposRequeridos(){
        if(cadenaVacia(this.idFormaPago)){
            //TODO msg en el properties
            Mensajes.asignarMensajeError("Debe seleccionar la forma de pago");
        }else{
            if(this.idFormaPago.equals(FormaPago.ENTIDAD_BANCARIA.name())){
                if(cadenaVacia(idEntidadBancaria)){
                    //TODO msg en el properties
                    Mensajes.asignarMensajeError("Debe seleccionar la entidad bancaria");
                }else{
                    return true;
                }
            }else if(this.idFormaPago.equals(FormaPago.TARJETA_CREDITO.name())){
                if(cadenaVacia(idEntidadTarjeta)){
                    //TODO msg en el properties
                    Mensajes.asignarMensajeError("Debe seleccionar la tarjeta de credito");
                }
                else if(cadenaVacia(this.venta.getDatosTarjeta().getNombresApellidos())){
                    //TODO msg en el properties
                    Mensajes.asignarMensajeError("Debe diligenciar los nombres y apellidos");
                }
                else if(cadenaVacia(this.venta.getDatosTarjeta().getNumeroTarjeta())){
                    //TODO msg en el properties
                    Mensajes.asignarMensajeError("Debe diligenciar el número de la tarjeta de crédito");
                }
                else if(cadenaVacia(this.venta.getDatosTarjeta().getCodigoSeguridad())){
                    //TODO msg en el properties
                    Mensajes.asignarMensajeError("Debe diligenciar el código de seguridad");
                }
                else if(this.venta.getDatosTarjeta().getFechaExpiracion() == null){
                    //TODO msg en el properties
                    Mensajes.asignarMensajeError("Debe diligenciar la fecha de expiración");
                }
                else{
                    return true;
                }
            }
        }
        return false;
    }

    public static boolean cadenaVacia(String cadena){
        return cadena  == null || cadena.trim().length() <= 0;
    }

    public boolean isCombo1() {
        return combo1;
    }

    public void setCombo1(boolean combo1) {
        this.combo1 = combo1;
    }

    public boolean getCombo1() {
        return combo1;
    }

    public boolean isCombo2() {
        return combo2;
    }

    public boolean getCombo2() {
        return combo2;
    }

    public void setCombo2(boolean combo2) {
        this.combo2 = combo2;
    }

    public String getDescripcionVenta() {
        return descripcionVenta;
    }

    public void setDescripcionVenta(String descripcionVenta) {
        this.descripcionVenta = descripcionVenta;
    }

    public List<SelectItem> getEntidadesBancaria() {
        return entidadesBancaria;
    }

    public void setEntidadesBancaria(List<SelectItem> entidadesBancaria) {
        this.entidadesBancaria = entidadesBancaria;
    }

    public List<SelectItem> getEntidadesTarjeta() {
        return entidadesTarjeta;
    }

    public void setEntidadesTarjeta(List<SelectItem> entidadesTarjeta) {
        this.entidadesTarjeta = entidadesTarjeta;
    }

    public List<SelectItem> getFormasPago() {
        return formasPago;
    }

    public void setFormasPago(List<SelectItem> formasPago) {
        this.formasPago = formasPago;
    }

    public String getIdEntidadBancaria() {
        return idEntidadBancaria;
    }

    public void setIdEntidadBancaria(String idEntidadBancaria) {
        this.idEntidadBancaria = idEntidadBancaria;
    }

    public String getIdEntidadTarjeta() {
        return idEntidadTarjeta;
    }

    public void setIdEntidadTarjeta(String idEntidadTarjeta) {
        this.idEntidadTarjeta = idEntidadTarjeta;
    }

    public String getIdFormaPago() {
        return idFormaPago;
    }

    public void setIdFormaPago(String idFormaPago) {
        this.idFormaPago = idFormaPago;
    }

    public String[] getLEntidades() {
        return lEntidades;
    }

    public void setLEntidades(String[] lEntidades) {
        this.lEntidades = lEntidades;
    }

    public boolean isValidaSesion() {
        return validaSesion;
    }

    public void setValidaSesion(boolean validaSesion) {
        this.validaSesion = validaSesion;
    }

    public Venta getVenta() {
        return venta;
    }

    public void setVenta(Venta venta) {
        this.venta = venta;
    }

    public boolean isComprado() {
        return comprado;
    }

    public void setComprado(boolean comprado) {
        this.comprado = comprado;
    }
}